home *** CD-ROM | disk | FTP | other *** search
/ HTBasic 9.3 / HTBasic 9.3.iso / 93win / data1.cab / DLL_Toolkit / Source / HTBImage / Image.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2005-03-02  |  5.8 KB  |  284 lines

  1. // Image.cpp: implementation of the Image class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4.  
  5. #include "stdafx.h"
  6. //#include "HTBImage.h"
  7. #include "Image.h"
  8. #include "export.h"
  9. //#include "winuser.h"
  10.  
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16.  
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. short Image::sm_NextImageID = 1;
  21.  
  22. Image::Image()
  23. {
  24. //    m_ImageFilename.Empty();
  25.     m_Region = NULL;
  26.     m_Signal = 0;
  27.     m_Xpos = 0;
  28.     m_Ypos = 0;
  29.     m_ImageID = sm_NextImageID++;
  30.     m_pNextImage = NULL;
  31.     m_hBitmap = NULL;
  32.     m_bShow = FALSE;
  33.     m_bAllowDrag = FALSE;
  34.     m_bDragging = FALSE;
  35.  
  36. }
  37.  
  38. Image::~Image()
  39. {
  40.     if (m_pNextImage)
  41.     {
  42.         delete m_pNextImage;
  43.     }
  44.     
  45. }
  46.  
  47. Image * Image::AddImage()
  48. {
  49.     Image * pCurrent = this;
  50.  
  51.     while (pCurrent->m_pNextImage != NULL)
  52.     {
  53.         pCurrent = pCurrent->m_pNextImage;
  54.     }
  55.  
  56.     pCurrent->m_pNextImage = new Image;
  57.  
  58.     return(pCurrent->m_pNextImage);
  59. }
  60.  
  61. BOOL Image::LoadImage(char * ImageFilename)
  62. {
  63.     //m_ImageFilename = ImageFilename;
  64.     strcpy(m_ImageFilename,ImageFilename);
  65.  
  66.     m_hBitmap = ::LoadImage(NULL,m_ImageFilename,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
  67.  
  68.     if (m_hBitmap == NULL)
  69.     {
  70.         return(FALSE);
  71.     }
  72.  
  73.     // Get the color depth of the DIBSection
  74.     GetObject(m_hBitmap, sizeof(BITMAP), &m_bm );
  75.     // If the DIBSection is 256 color or less, it has a color table
  76.     if ((m_bm.bmBitsPixel * m_bm.bmPlanes ) <= 8)
  77.     {
  78.        HDC           hMemDC;
  79.        HANDLE       hOldBitmap;
  80.        RGBQUAD       rgb[256];
  81.        LPLOGPALETTE  pLogPal;
  82.        WORD          i;
  83.  
  84.        // Create a memory DC and select the DIBSection into it
  85.        hMemDC = CreateCompatibleDC( NULL );
  86.        hOldBitmap = SelectObject( hMemDC, m_hBitmap );
  87.        // Get the DIBSection's color table
  88.        GetDIBColorTable( hMemDC, 0, 256, rgb );
  89.        // Create a palette from the color table
  90.        pLogPal = (tagLOGPALETTE *)malloc( sizeof(LOGPALETTE) + (256*sizeof(PALETTEENTRY)) );
  91.        pLogPal->palVersion = 0x300;
  92.        pLogPal->palNumEntries = 256;
  93.        for(i=0;i<256;i++)
  94.        {
  95.          pLogPal->palPalEntry[i].peRed = rgb[i].rgbRed;
  96.          pLogPal->palPalEntry[i].peGreen = rgb[i].rgbGreen;
  97.          pLogPal->palPalEntry[i].peBlue = rgb[i].rgbBlue;
  98.          pLogPal->palPalEntry[i].peFlags = 0;
  99.        }
  100.        m_hPalette = CreatePalette( pLogPal );
  101.        // Clean up
  102.        free( pLogPal );
  103.        SelectObject( hMemDC, hOldBitmap );
  104.        DeleteDC( hMemDC );
  105.      }
  106.      else   // It has no color table, so use a halftone palette
  107.      {
  108.        HDC    hRefDC;
  109.  
  110.        hRefDC = GetDC( NULL );
  111.        m_hPalette = CreateHalftonePalette( hRefDC );
  112.        ReleaseDC( NULL, hRefDC );
  113.      }
  114.  
  115.      return TRUE;
  116.     
  117. }
  118.  
  119. short Image::GetID()
  120. {
  121.     return(m_ImageID);
  122. }
  123.  
  124. void Image::Show(short ID,short Xpos, short Ypos, DWORD RasterOp)
  125. {
  126.     Image * pCurrent = this;
  127.  
  128.     while (pCurrent->m_ImageID != ID && pCurrent->m_pNextImage != NULL)
  129.     {
  130.         pCurrent = pCurrent->m_pNextImage;
  131.     }
  132.  
  133.     if (pCurrent->m_ImageID == ID)
  134.     {
  135.         pCurrent->m_Xpos = Xpos;
  136.         pCurrent->m_Ypos = Ypos;
  137.         pCurrent->m_RasterOp = RasterOp;
  138.         pCurrent->m_bShow = TRUE;
  139.     }
  140.  
  141. }
  142.  
  143. void Image::NoShow(short ID)
  144. {
  145.     Image * pCurrent = this;
  146.  
  147.     while (pCurrent->m_ImageID != ID && pCurrent->m_pNextImage != NULL)
  148.     {
  149.         pCurrent = pCurrent->m_pNextImage;
  150.     }
  151.  
  152.     if (pCurrent->m_ImageID == ID)
  153.     {
  154.         pCurrent->m_bShow = FALSE;
  155.     }
  156. }
  157.  
  158. void Image::Draw(HDC hDC)
  159. {
  160.     Image * pCurrent = this;
  161.     
  162.  
  163.     while (pCurrent)
  164.     {
  165.         if (pCurrent->m_bShow)
  166.         {
  167.             HBITMAP hOldBitmap;
  168.             HDC hMemDC = CreateCompatibleDC(NULL);
  169.  
  170.             SelectPalette(hMemDC,pCurrent->m_hPalette,FALSE);
  171.             RealizePalette(hMemDC);
  172.             hOldBitmap = (HBITMAP)SelectObject(hMemDC,(HBITMAP)pCurrent->m_hBitmap);
  173.  
  174.  
  175.             BitBlt(hDC,pCurrent->m_Xpos,pCurrent->m_Ypos,pCurrent->m_bm.bmWidth,pCurrent->m_bm.bmHeight,hMemDC,0,0,SRCCOPY);
  176.         
  177.  
  178.             SelectObject(hMemDC,hOldBitmap);
  179.             DeleteDC(hMemDC);
  180.         }
  181.  
  182.         pCurrent = pCurrent->m_pNextImage;
  183.  
  184.     }
  185.  
  186. }
  187.  
  188. void Image::CreateRegion(short ID, short signal, short AllowDrag)
  189. {
  190.     Image * pCurrent = this;
  191.     
  192.     while (pCurrent->m_ImageID != ID && pCurrent->m_pNextImage != NULL)
  193.     {
  194.         pCurrent = pCurrent->m_pNextImage;
  195.     }
  196.  
  197.     if (pCurrent->m_ImageID == ID)
  198.     {
  199.         pCurrent->m_Signal = signal;
  200.         pCurrent->m_Region = CreateRectRgn(pCurrent->m_Xpos,pCurrent->m_Ypos,
  201.  
  202.         pCurrent->m_Xpos + pCurrent->m_bm.bmWidth, pCurrent->m_Ypos + pCurrent->m_bm.bmHeight);
  203.         
  204.         pCurrent->m_bAllowDrag = AllowDrag;
  205.  
  206.     }
  207. }
  208.  
  209. void Image::EvalRegion(CPoint point)
  210. {
  211.     Image * pCurrent = this;
  212.     int signal = 0;
  213.     
  214.     do
  215.     {
  216.         if (pCurrent->m_bShow && PtInRegion(pCurrent->m_Region,point.x,point.y))
  217.         {
  218.             signal = pCurrent->m_Signal;
  219.     
  220.         }
  221.  
  222.         pCurrent = pCurrent->m_pNextImage;
  223.  
  224.     } while (pCurrent != NULL);
  225.  
  226.     if (signal)
  227.     {
  228.         Signal(signal);
  229.     }
  230.  
  231.     
  232. }
  233.  
  234.  
  235. void Image::EvalRegionForDrag(CPoint point, BOOL bStartDrag)
  236. {
  237.     Image * pCurrent = this;
  238.     int signal = 0;
  239.     
  240.     do
  241.     {
  242.         if (pCurrent->m_bShow && pCurrent->m_bAllowDrag && PtInRegion(pCurrent->m_Region,point.x,point.y))
  243.         {
  244.             pCurrent->SetDragging(bStartDrag);
  245.             
  246.         }
  247.  
  248.         pCurrent = pCurrent->m_pNextImage;
  249.  
  250.     } while (pCurrent != NULL);
  251.     
  252. }
  253.  
  254. void Image::SetDragging(BOOL bDragging)
  255. {
  256.     m_bDragging = bDragging;
  257. }
  258.  
  259.  
  260. void Image::SetDraggingToMouse(CPoint point)
  261. {
  262.     Image * pCurrent = this;
  263.     int signal = 0;
  264.     
  265.     do
  266.     {
  267.         if (pCurrent->m_bShow && pCurrent->m_bDragging)
  268.         {
  269.             pCurrent->m_Xpos = (short)point.x;
  270.             pCurrent->m_Ypos = (short)point.y;    
  271.             CreateRegion(pCurrent->m_ImageID,pCurrent->m_Signal,pCurrent->m_bAllowDrag);
  272.             RefreshScreen();
  273.  
  274.         }
  275.  
  276.         pCurrent = pCurrent->m_pNextImage;
  277.  
  278.     } while (pCurrent != NULL);
  279.  
  280.     
  281.  
  282.     
  283. }
  284.